package ch.fhnw.qualiscan.application.models;

import ch.fhnw.qualiscan.core.Model;
import ch.fhnw.qualiscan.core.db.pojos.Domain;
import ch.fhnw.qualiscan.core.db.pojos.Questionnaire;
import ch.fhnw.qualiscan.core.db.pojos.Survey;
import ch.fhnw.qualiscan.core.db.pojos.User;

import java.util.List;
import java.util.Set;

/**
 *
 * @author bengro
 */
public class QuestionnaireModel extends Model {

    /**
     * Get all questionnaires
     * @return 
     */
    public List<Questionnaire> getQuestionnaires() {
        List<Questionnaire> questionnaireList = hibernateSession.getSession().createQuery("from Questionnaire as questionnaire").list();
        return questionnaireList;
    }
    
    public List<Questionnaire> getQuestionnaires(User user) {
    	List<Questionnaire> questionnaireList = hibernateSession.getSession().createQuery("from Questionnaire as questionnaire where questionnaire.user = :user")
    			.setParameter("user", user)
    			.list();
    	
    	return questionnaireList;
    }
    
    /**
     * Get active questionnaires.
     * @return 
     */
    public List<Questionnaire> getActiveQuestionnaires() {
        List<Questionnaire> questionnaireList = hibernateSession.getSession().createQuery("from Questionnaire as questionnaire where questionnaire.active = 1").list();
        return questionnaireList;
    }
    
    
    /**
     * Returns the activated questionnaires of a given user. Includes questionnaires provided by the administrator.
     * @param user
     * @return R
     */
    public List<Questionnaire> getActiveQuestionnaires(User user) {
    	List<Questionnaire> questionnaireList = hibernateSession.getSession().createQuery("from Questionnaire as questionnaire where (questionnaire.user = :user or questionnaire.user = 0) and questionnaire.active = 1")
    			.setParameter("user", user)
    			.list();
    	
    	return questionnaireList;
    }
    
    /** 
     * Get questionnaire by title
     */
    public Questionnaire getQuestionnaire(String toString) {
        return null;
    }
    
    public boolean addQuestionnaire(Questionnaire questionnaire) {
        hibernateSession.getSession().save(questionnaire);
        hibernateSession.closeSession();
        return true;
    }
    
    public boolean removeQuestionnaire(Questionnaire questionnaire) {
        
        AdminModel adminModel = new AdminModel();
        SurveyModel surveyModel = new SurveyModel();
        
        // delete associated domains
        Set<Domain> domainList = questionnaire.getDomains();
        for(Domain domain : domainList) {
            adminModel.deleteDomain(domain);
        }
       
        //delete surveys - including answers, best practices, evaluation
        List<Survey> surveys = surveyModel.getSurveyByQuestionnaire(questionnaire);
        for(Survey survey : surveys) {
            adminModel.deleteSurvey(survey);
        }
        
        // delete questionnaire itself
        hibernateSession.getSession().delete(questionnaire);
        hibernateSession.closeSession();
        
        
        return true;
    }
    
    public List<Domain> getDomainsOfQuestionnaire(Questionnaire questionnaire) {
        List<Domain> domains = hibernateSession.getSession().createQuery("from Questionnaire as q WHERE questionnaireId = :qId")
			.setParameter("qId", questionnaire.getId()).list();
        return domains; 
    }
    
    public boolean addDomainsToQuestionnaire(List<Domain> domains, Questionnaire questionnaire) {
        
        return true;
    }

    public Questionnaire getQuestionnaire(int Id) {
        Questionnaire q = (Questionnaire) hibernateSession.getSession().createQuery("from Questionnaire as q where q.id = :id")
        	.setParameter("id", Id)
        	.uniqueResult();

        return q;
    }

    /**
     * udpates the given questionnaire.
     * @param questionnaire 
     */
    public void updateQuestionnaire(Questionnaire questionnaire) {
        hibernateSession.getSession().merge(questionnaire);
	hibernateSession.closeSession();
    }

    
    
}
